package com.hkts.naturalgas.datahandler.utils;

import com.hkts.naturalgas.datahandler.constance.FunctionCacheConstance;
import com.hkts.naturalgas.datahandler.curvecache.CurveCache;
import com.hkts.naturalgas.datahandler.entity.FunctionCache;
import com.hkts.naturalgas.datahandler.vo.AdjustmentVo;
import com.hkts.naturalgas.datahandler.vo.SimulationDataVo;
import lombok.extern.slf4j.Slf4j;

/**
 * @ClassNameMiddleCurveFunctionUtils
 * @Description
 * @Author yck
 * @Date2021-10-31 15:31
 * @Version V1.0
 **/
@Slf4j
public class MiddleCurveFunctionUtils {
            //"----------进入中段随机曲线控制器------------"
    public static Float CurveFunctionHandler(AdjustmentVo vo, SimulationDataVo simulationData) {

        FunctionCache functionCache = CurveCache.functionCache.get(vo.getItemName());
        if (functionCache == null) {
            //首次初始化 使用随机方案
            functionCache = new FunctionCache();
            functionCache.setItemName(vo.getItemName());
            functionCache.setUpOrDown(FunctionCacheConstance.RANDOM);
            functionCache.setTimeInterval(0f);
            vo.setLastRowValue( vo.getLastRowValue()+GetRandomUtils.getWhetherCarry(vo,simulationData));
            CurveCache.functionCache.put(vo.getItemName(), functionCache);
        } else {
            if (functionCache.getUpOrDown().equals(FunctionCacheConstance.RANDOM)) {
                vo.setLastRowValue( vo.getLastRowValue()+GetRandomUtils.getWhetherCarry(vo,simulationData));
                updateCache(vo);
            } else if (functionCache.getUpOrDown().equals(FunctionCacheConstance.UP)) {
                //判断当前的一个状态是否还在温度上升状态
                if (vo.getLastRowValue() >= functionCache.getValue() || vo.getCurrentSeconds() >= functionCache.getTimeInterval()) {
                    vo.setLastRowValue( vo.getLastRowValue()+GetRandomUtils.getWhetherCarry(vo,simulationData));
                    updateCache(vo);
                } else {
                    //随机系数上升速度的系数
                    float offsetData = GetRandomUtils.getOffsetData(0, 10);
                    //根据上升速度和上次记录求出上升温度的大小
                    vo.setLastRowValue(vo.getLastRowValue() + GetRandomUtils.getWhetherCarry(offsetData, vo.getLastRateSeconds()));
                }
            } else if (functionCache.getUpOrDown().equals(FunctionCacheConstance.DOWN)) {
                if (vo.getLastRowValue() <= functionCache.getValue() || vo.getCurrentSeconds() >= functionCache.getTimeInterval()) {
                    vo.setLastRowValue(vo.getLastRowValue()+GetRandomUtils.getWhetherCarry(vo,simulationData));
                    updateCache(vo);
                } else {
                    //随机系数上升速度的系数
                    float offsetData = GetRandomUtils.getOffsetData(0, 10);
                    //根据上升速度和上次记录求出上升温度的大小
                    vo.setLastRowValue(vo.getLastRowValue() - GetRandomUtils.getWhetherCarry(offsetData, vo.getLastRateSeconds()));
                }
            }
        }
        return vo.getLastRowValue();
    }

    /**
     * 功能描述:
     * [vo]
     *
     * @return: void
     * @Author: 杨春科
     * @Date: 2021-10-29 11:24
     * @Description // 更新该字段的缓存
     */
    public static void updateCache(AdjustmentVo vo) {
        //设置缓存
        //根据随机结果设置曲线，60% 随机，20%上升曲线，20%下降曲线
        String curveRandom = getCurveRandom(vo);
        //获取当前字段的缓存
        FunctionCache functionCache = CurveCache.functionCache.get(vo.getItemName());
        if (curveRandom.equals(FunctionCacheConstance.UP)) {
            //如果上一条记录非常接近温度最高值则不设置为温度上升区间，设置为温度随机
            if (vo.getLastRowValue() >= vo.getTemperature() - 10) {
                functionCache.setUpOrDown(FunctionCacheConstance.RANDOM);
                CurveCache.functionCache.put(vo.getItemName(), functionCache);
            } else {
                functionCache.setUpOrDown(FunctionCacheConstance.UP);
                //根据当前温度的值及最高温度算出随机上升的温度值
                if(vo.getItemIndex()==0||vo.getItemIndex()==vo.getItemNum()-1){
                    float offsetTemperature = GetRandomUtils.getOffsetData((int) vo.getLastRowValue(), (int) vo.getTemperature());
                    //根据当前的时间秒数求一个随机的温度上升时间
                    float offsetSeconds = GetRandomUtils.getOffsetData((int) vo.getCurrentSeconds(),(int) vo.getCurrentSeconds()+ ((int) vo.getTotalSeconds()-(int) vo.getCurrentSeconds())/10);
                    functionCache.setValue(offsetTemperature);
                    //如果秒数小于温度则当前时间再加上温度时间为总时间
                    if (offsetSeconds < offsetTemperature - vo.getLastRowValue()) {
                        functionCache.setTimeInterval(offsetTemperature + offsetTemperature - vo.getLastRowValue());
                    } else {
                        functionCache.setTimeInterval(offsetSeconds);
                    }
                }else{
                    float offsetTemperature = GetRandomUtils.getOffsetData((int) vo.getLastRowValue(), (int) vo.getTemperature());
                    //根据当前的时间秒数求一个随机的温度上升时间
                    float offsetSeconds = GetRandomUtils.getOffsetData((int) vo.getCurrentSeconds(),(int) vo.getCurrentSeconds()+ ((int) vo.getTotalSeconds()-(int) vo.getCurrentSeconds())/10);
                    functionCache.setValue(offsetTemperature);
                    //如果秒数小于温度则当前时间再加上温度时间为总时间
                    if (offsetSeconds < offsetTemperature - vo.getLastRowValue()) {
                        functionCache.setTimeInterval(offsetTemperature + offsetTemperature - vo.getLastRowValue());
                    } else {
                        functionCache.setTimeInterval(offsetSeconds);
                    }
                }
            }
        } else if (curveRandom.equals(FunctionCacheConstance.DOWN)) {
            if (vo.getLastRowValue() <= vo.getTemperature() - 100) {
                functionCache.setUpOrDown(FunctionCacheConstance.RANDOM);
                CurveCache.functionCache.put(vo.getItemName(), functionCache);
            } else {
                //根据当前温度的值及最高温度算出随机上升的温度值
                float offsetTemperature = GetRandomUtils.getOffsetData((int) vo.getLastRowValue() - 50, (int) vo.getLastRowValue());
                //根据当前的时间秒数求一个随机的温度上升时间
                float offsetSeconds = GetRandomUtils.getOffsetData((int) vo.getCurrentSeconds(), (int) vo.getCurrentSeconds()+ ((int) vo.getTotalSeconds()-(int) vo.getCurrentSeconds())/10);
                functionCache.setUpOrDown(FunctionCacheConstance.DOWN);
                functionCache.setValue(offsetTemperature);
                //如果秒数小于温度则当前时间再加上温度时间为总时间
                if (offsetSeconds < vo.getLastRowValue() - offsetTemperature) {
                    functionCache.setTimeInterval(vo.getLastRowValue() - offsetTemperature + offsetSeconds);
                } else {
                    functionCache.setTimeInterval(offsetSeconds);
                }
            }
        } else {
            functionCache.setUpOrDown(FunctionCacheConstance.RANDOM);
            CurveCache.functionCache.put(vo.getItemName(), functionCache);
        }

    }

    /**
     * 功能描述:
     * 随机获取下个时间段的曲线类别
     *
     * @return:
     * @Author: 杨春科
     * @Date: 2021-10-29 13:55
     * @Description //TODO
     */
    public static String getCurveRandom(AdjustmentVo vo) {
        //设置缓存
        //测试环境根据随机结果设置曲线，60% 随机，20%上升曲线，20%下降曲线
        //真实环境
        if(vo.getItemIndex()==0||vo.getItemIndex()==vo.getItemNum()-1){
            int random = (int) (Math.random() * (220000 - 1) + 1);
            if (random <= 10 ) {
                return FunctionCacheConstance.UP;
            } else if (random >= 10&&random<20) {
                return FunctionCacheConstance.DOWN;
            } else {
                return FunctionCacheConstance.RANDOM;
            }
        }else{
            int random = (int) (Math.random() * (220000 - 1) + 1);
            if (random <= 2) {
                return FunctionCacheConstance.UP;
            } else if (random > 2&&random<=4) {
                return FunctionCacheConstance.DOWN;
            } else {
                return FunctionCacheConstance.RANDOM;
            }
        }

    }
}
